//package com.yunhe.common.util;
//
//import com.yunhe.common.client.TsdbClient;
//import com.yunhe.common.constant.TsdbConsts;
//import com.yunhe.common.domain.data.*;
//import com.yunhe.common.service.base.MeasurePointMapService;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.text.MessageFormat;
//import java.util.*;
//
///**
// * 量测数据HBase操作工具类
// * @author liuronglei
// */
//@Component
//public class MeasTsdbUtil {
//    private Logger logger = LoggerFactory.getLogger(MeasTsdbUtil.class);
//    @Autowired
//    private MeasurePointMapService measurePointMapService;
//    @Autowired
//    private TsdbClient tsdbClient;
//
//    /**
//     * 根据Tsdb返回的数据构建量测对象
//     * @param itemList Tsdb返回的数据List
//     * @return Measurement
//     */
//    private Measurement convertMeasurementFirst(List<TsdbResultItem> itemList) {
//        List<Measurement> measurementList = convertMeasurement(itemList);
//        if (measurementList == null || measurementList.size() == 0) {
//            return null;
//        } else {
//            return measurementList.get(0);
//        }
//    }
//
//    /**
//     * 根据Tsdb返回的数据构建量测对象
//     * @param item Tsdb返回的数据
//     * @return List<Measurement>
//     */
//    private List<Measurement> convertMeasurement(TsdbResultItem item) {
//        if (item == null) return null;
//        List<Measurement> measurementList = new ArrayList<>();
//        Map<Long, Long> sjidPidMap = measurePointMapService.getSjidPidMap();
//        Long sjid = Long.parseLong(item.getMetric());
//        String flagStr = item.getTags().get(TsdbConsts.MEAS_COLUMN.FLAG.value());
//        Map<String, Double> dps = item.getDps();
//        for (Map.Entry<String, Double> entry : dps.entrySet()) {
//            Long timestamp = Long.parseLong(entry.getKey());
//            Double value = entry.getValue();
//            Integer flag = flagStr == null ? TsdbConsts.MEAS_FLAG.FALSE.value() : Integer.parseInt(flagStr);
//            Measurement measurement = new Measurement();
//            measurement.setPointNumber(sjid);
//            measurement.setDtime(new Date(timestamp*1000));
//            measurement.setVal(value);
////            measurement.setFlag(flag);
//            if (sjidPidMap != null) {
//                measurement.setPointNumber(sjidPidMap.get(sjid));
//            }
//            measurementList.add(measurement);
//        }
//        return measurementList;
//    }
//
//    /**
//     * 根据Tsdb返回的数据构建量测对象List
//     * @param itemList Tsdb返回的数据List
//     * @return List<Measurement>
//     */
//    private List<Measurement> convertMeasurement(List<TsdbResultItem> itemList) {
//        if (itemList == null) return null;
//        List<Measurement> result = new ArrayList<>();
//        for (TsdbResultItem item : itemList) {
//            result.addAll(convertMeasurement(item));
//        }
//        return result;
//    }
//
//    private TsdbInsertItem convertInsertItem(Measurement measurement) {
//        if (measurement == null) return null;
//        TsdbInsertItem insertItem = new TsdbInsertItem();
//        Map<String, Object> tags = new HashMap<>();
////        tags.put(TsdbConsts.MEAS_COLUMN.FLAG.value(), measurement.getFlag());
//        insertItem.setMetric(String.valueOf(measurement.getPointNumber()));
//        insertItem.setTimestamp(measurement.getDtime().getTime()/1000);
//        insertItem.setValue(measurement.getVal());
//        insertItem.setTags(tags);
//        return insertItem;
//    }
//
//    private List<TsdbInsertItem> convertInsertItem(List<Measurement> itemList) {
//        if (itemList == null) return null;
//        List<TsdbInsertItem> result = new ArrayList<>();
//        for (Measurement item : itemList) {
//            result.add(convertInsertItem(item));
//        }
//        return result;
//    }
//
//    /**
//     * 获得数据ID在时间区间内的所有量测
//     * @param sjid 数据ID
//     * @param startDate 开始时间
//     * @param endDate 结束时间
//     * @return List<Measurement>
//     */
//    public List<Measurement> getResultScanner(Long sjid, Date startDate, Date endDate) {
//        TsdbQueryParam param = new TsdbQueryParam();
//        param.setMetric(String.valueOf(sjid));
//        TsdbQuery query = new TsdbQuery(startDate.getTime()/1000, endDate.getTime()/1000, Collections.singletonList(param));
//        List<TsdbResultItem> resultItems = tsdbClient.queryData(query);
//        return convertMeasurement(resultItems);
//    }
//
//    /**
//     * 获得数据ID在时间区间内的第一个量测
//     * @param sjid 数据ID
//     * @param startDate 开始时间
//     * @param endDate 结束时间
//     * @return Measurement
//     */
//    public Measurement getResultScannerFirst(Long sjid, Date startDate, Date endDate) {
//        Map<String, String> tags = new HashMap<>();
//        tags.put(TsdbConsts.MEAS_COLUMN.FLAG.value(), String.valueOf(TsdbConsts.MEAS_FLAG.FALSE.value()));
//        TsdbQueryParam param = new TsdbQueryParam();
//        param.setMetric(String.valueOf(sjid));
//        param.setLimit(1);
//        param.setTags(tags);
//        TsdbQuery query = new TsdbQuery(startDate.getTime()/1000, endDate.getTime()/1000, Collections.singletonList(param));
//        List<TsdbResultItem> resultItems = tsdbClient.queryData(query);
//        return convertMeasurementFirst(resultItems);
//    }
//
//    /**
//     * 获得数据ID在时间区间内的最后一个量测
//     * @param sjid 数据ID
//     * @param startDate 开始时间
//     * @param endDate 结束时间
//     * @return Measurement
//     */
//    public Measurement getResultScannerLast(Long sjid, Date startDate, Date endDate) {
//        // 先获取总数量
//        String countColumn = "mycount";
//        String sql = MessageFormat.format("select count(1) {0} from tsdb.`{1}` where `timestamp` between {2} and {3} and {4}={5}",
//                countColumn, String.valueOf(sjid), String.valueOf(startDate.getTime()), String.valueOf(endDate.getTime()),
//                TsdbConsts.MEAS_COLUMN.FLAG.value(), TsdbConsts.MEAS_FLAG.FALSE.value());
//        TsqlQuery tsqlQuery = new TsqlQuery(sql);
//        TsqlResult tsqlResult = tsdbClient.sqlQuery(tsqlQuery);
//        Integer count = Integer.valueOf((String)tsqlResult.getRows().get(0).get(countColumn));
//        // 如果数量>0，则取最后一条
//        if (count > 0) {
//            Map<String, String> tags = new HashMap<>();
//            tags.put(TsdbConsts.MEAS_COLUMN.FLAG.value(), String.valueOf(TsdbConsts.MEAS_FLAG.FALSE.value()));
//            TsdbQueryParam param = new TsdbQueryParam();
//            param.setMetric(String.valueOf(sjid));
//            param.setLimit(1);
//            param.setOffset(count - 1);
//            param.setTags(tags);
//            TsdbQuery query = new TsdbQuery(startDate.getTime()/1000, endDate.getTime()/1000, Collections.singletonList(param));
//            List<TsdbResultItem> resultItems = tsdbClient.queryData(query);
//            return convertMeasurementFirst(resultItems);
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 获得数据ID在某个时间点的量测
//     * @param sjid 数据ID
//     * @param dtime 时间
//     * @return Measurement
//     */
//    public Measurement getRowData(Long sjid, Date dtime) {
//        return getResultScannerFirst(sjid, dtime, dtime);
//    }
//
//    /**
//     * 为表添加 or 更新数据
//     * @param measurement 量测对象
//     */
//    public void putData(Measurement measurement) {
//        List<TsdbInsertItem> insertItems = new ArrayList<>();
//        insertItems.add(convertInsertItem(measurement));
//        tsdbClient.insertData(insertItems);
//    }
//
//    /**
//     * 为表添加 or 更新数据（批量）
//     * @param measList 量测对象列表
//     */
//    public void putData(List<Measurement> measList) {
//        List<TsdbInsertItem> insertItems = convertInsertItem(measList);
//        tsdbClient.insertData(insertItems);
//    }
//
//    /**
//     * 获得某个时间点的所有sjid
//     * @param dtime 时间点
//     * @return List<Measurement>
//     */
//    public Map<Long, Object> getSjidByDtime(Date dtime) {
//        return new HashMap<>();
//    }
//
//    /**
//     * 获得与传入值不同的上一个量测对象
//     * @param sjid 数据ID
//     * @param currentVal 传入值
//     * @return Measurement
//     */
//    public Measurement getPreValue(Long sjid, Double currentVal) {
//        // 先获取总数量
//        String countColumn = "mycount";
//        String sql = MessageFormat.format("select count(1) {0} from tsdb.`{1}` where `value`<>{2} and {3}={4}",
//                countColumn, String.valueOf(sjid), currentVal,
//                TsdbConsts.MEAS_COLUMN.FLAG.value(), TsdbConsts.MEAS_FLAG.FALSE.value());
//        TsqlQuery tsqlQuery = new TsqlQuery(sql);
//        TsqlResult tsqlResult = tsdbClient.sqlQuery(tsqlQuery);
//        Integer count = Integer.valueOf((String)tsqlResult.getRows().get(0).get(countColumn));
//        // 如果数量>0，则取最后一条
//        if (count > 0) {
//            Map<String, String> tags = new HashMap<>();
//            tags.put(TsdbConsts.MEAS_COLUMN.FLAG.value(), String.valueOf(TsdbConsts.MEAS_FLAG.FALSE.value()));
//            TsdbQueryParam param = new TsdbQueryParam();
//            param.setMetric(String.valueOf(sjid));
//            param.setLimit(1);
//            param.setOffset(count - 1);
//            param.setTags(tags);
//            TsdbQuery query = new TsdbQuery(0L, Long.MAX_VALUE, Collections.singletonList(param));
//            List<TsdbResultItem> resultItems = tsdbClient.queryData(query);
//            return convertMeasurementFirst(resultItems);
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 获得与传入值相同的第一个量测对象
//     * @param sjid 数据ID
//     * @param val 传入值
//     * @return Measurement
//     */
//    public Measurement findFirstBySjidAndVal(Long sjid, Double val) {
//        Map<String, String> tags = new HashMap<>();
//        tags.put(TsdbConsts.MEAS_COLUMN.FLAG.value(), String.valueOf(TsdbConsts.MEAS_FLAG.FALSE.value()));
//        TsdbQueryParam param = new TsdbQueryParam();
//        param.setMetric(String.valueOf(sjid));
//        param.setLimit(1);
//        param.setTags(tags);
//        param.setDpValue("=" + val);
//        TsdbQuery query = new TsdbQuery(0L, Long.MAX_VALUE, Collections.singletonList(param));
//        List<TsdbResultItem> resultItems = tsdbClient.queryData(query);
//        return convertMeasurementFirst(resultItems);
//    }
//
//    /**
//     * 根据rowKey删除指定的行
//     * @param sjid 数据ID
//     * @param dtime 时间
//     * @return boolean
//     */
//    public boolean deleteRow(Long sjid, Date dtime) {
//        TsdbDelete delete = new TsdbDelete();
//        delete.setMetric(String.valueOf(sjid));
//        delete.setStart(dtime.getTime()/1000);
//        delete.setEnd(dtime.getTime()/1000);
//        tsdbClient.deleteData(delete);
//        return true;
//    }
//}
//
